package boundary;

import javax.swing.JPanel;
import java.awt.Frame;
import java.awt.Toolkit;
import javax.swing.DefaultListModel;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JScrollPane;
import dataview.Cibi;
import dataview.Ricette;
import dataview.UnitaPorzioni;
import exceptions.DBException;
import store.Cibo;
import store.Portata;
import store.PortataBevanda;
import store.PortataCibo;
import store.PortataPiatto;
import store.Ricetta;
import store.Termine;
import store.TutteRicette;
import store.TuttiCibi;
import java.awt.Insets;
import javax.swing.JList;
import boundary.ListaPortate.TipoDato;
import javax.swing.ImageIcon;
import java.awt.Font;

public class InserisciUnaPortata extends JDialog implements ActionListener {
	
	private static final long serialVersionUID = 1L;
	private ListaPortate lista;
	private Portata portata;
	private Ricette ricette;
	private Cibi bevande;
	private Cibi cibi;
	private int pos;
	private Ricetta ricetta;
	private Cibo cibo;
	private Cibo bevanda;
	private TipoDato td;
	private DefaultListModel model = null;
	private JPanel jContentPane = null;
	private JLabel jLabel = null;
	private JList jList = null;
	private JButton bAggiungi = null;
	private JButton bAnnulla = null;
	private JScrollPane spLista = null;
	
	/**
	 * @param owner
	 */
	public InserisciUnaPortata(Frame owner, ListaPortate lista, int pos, TipoDato td) {
		super(owner);
		this.lista = lista;
		this.pos = pos;
		this.td = td;
		initialize();
	}
	
	public InserisciUnaPortata(Frame owner, ListaPortate lista, int pos, Portata portata) {
		super(owner);
		this.lista = lista;
		this.pos = pos;
		this.portata = portata;
		initialize();
	}
	
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		if (portata != null) {
			if (portata instanceof PortataPiatto)
				td = TipoDato.RICETTE;
			else if (portata instanceof PortataCibo)
				td = TipoDato.CIBI;
			else
				td = TipoDato.BEVANDE;
		}
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (d.width - 480) / 2;
		int y = (d.height - 320) / 2;
		this.setSize(520, 360);
		this.setPreferredSize(new Dimension(520, 360));
		this.setMinimumSize(new Dimension(520, 360));
		this.setLocation(x, y);
		this.setLocationRelativeTo(getOwner());
		this.setTitle("Inserisci una portata");
		this.setModal(true);
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		this.setContentPane(getJContentPane());
		pack();
	}
	
	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			GridBagConstraints gridBagConstraints12 = new GridBagConstraints();
			gridBagConstraints12.gridx = 0;
			gridBagConstraints12.gridy = 2;
			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
			gridBagConstraints11.fill = GridBagConstraints.BOTH;
			gridBagConstraints11.gridy = 1;
			gridBagConstraints11.weightx = 1.0;
			gridBagConstraints11.weighty = 1.0;
			gridBagConstraints11.gridwidth = 2;
			gridBagConstraints11.insets = new Insets(5, 5, 5, 5);
			gridBagConstraints11.gridx = 0;
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.gridx = 1;
			gridBagConstraints1.anchor = GridBagConstraints.WEST;
			gridBagConstraints1.insets = new Insets(5, 5, 5, 5);
			gridBagConstraints1.gridy = 3;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.insets = new Insets(5, 5, 5, 5);
			gridBagConstraints.gridy = 3;
			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
			gridBagConstraints3.gridy = 0;
			gridBagConstraints3.gridx = 0;
			gridBagConstraints3.gridwidth = 2;
			jLabel = new JLabel();
			jLabel.setText(td == TipoDato.RICETTE ? "Aggiungere una ricetta al menu" : (td == TipoDato.CIBI ? "Aggiungere un cibo al menu" : "Aggiungere una bevanda al menu"));
			jLabel.setHorizontalAlignment(SwingConstants.CENTER);
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(jLabel, gridBagConstraints3);
			jContentPane.add(getBAggiungi(), gridBagConstraints);
			jContentPane.add(getBAnnulla(), gridBagConstraints1);
			jContentPane.add(getSpLista(), gridBagConstraints11);
		}
		return jContentPane;
	}
	
	/**
	 * This method initializes jList
	 * 
	 * @return javax.swing.JList
	 */
	private JList getJList() {
		if (jList == null) {
			jList = new JList();
			model = new DefaultListModel();
			
			switch (td) {
				case RICETTE:
					try {
						ricette = TutteRicette.getTutteRicette().tutteRicette();
						for (Ricetta r : ricette)
							model.addElement(r);
					} catch (DBException e) {
						e.printStackTrace();
					}
					break;
				case CIBI:
					try {
						cibi = new Cibi();
						for (Cibo c : TuttiCibi.getTuttiCibi().tuttiCibi()) {
							if (!(c.getTag().getFirst().diTipo(Termine.bevanda))) {
								cibi.add(c);
								model.addElement(c);
							}
						}
					} catch (DBException e) {
						e.printStackTrace();
					}
					break;
				case BEVANDE:
					try {
						
						bevande = new Cibi();
						for (Cibo b : TuttiCibi.getTuttiCibi().tuttiCibi()) {
							if (b.getTag().getFirst().diTipo(Termine.bevanda)) {
								bevande.add(b);
								model.addElement(b);
							}
						}
					} catch (DBException e) {
						e.printStackTrace();
					}
					break;
			}
			jList = new JList(model);
			jList.setCellRenderer(new MyListCellRenderer(false));
			jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			jList.setFont(new Font("Georgia", Font.PLAIN, 12));
			jList.setAutoscrolls(true);
			jList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
				public void valueChanged(javax.swing.event.ListSelectionEvent e) {
					getBAggiungi().setEnabled(getJList().getSelectedIndex() != -1);
				}
			});
		}
		return jList;
	}
	
	/**
	 * This method initializes bAggiungi
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBAggiungi() {
		if (bAggiungi == null) {
			bAggiungi = new JButton();
			bAggiungi.setText("Aggiungi");
			bAggiungi.setIcon(new ImageIcon(getClass().getResource("/icone/add-icon.png")));
			bAggiungi.setEnabled(false);
			bAggiungi.addActionListener(this);
		}
		return bAggiungi;
	}
	
	/**
	 * This method initializes bAnnulla
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBAnnulla() {
		if (bAnnulla == null) {
			bAnnulla = new JButton();
			bAnnulla.setText("Annulla");
			bAnnulla.setIcon(new ImageIcon(getClass().getResource("/icone/remove-icon.png")));
			bAnnulla.addActionListener(this);
		}
		return bAnnulla;
	}
	
	/**
	 * This method initializes spLista
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private JScrollPane getSpLista() {
		if (spLista == null) {
			spLista = new JScrollPane();
			spLista.setViewportView(getJList());
		}
		return spLista;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == getBAggiungi()) {
			if (jList.getSelectedIndex() < 0) return;
			switch (td) {
				case RICETTE:
					ricetta = ricette.get(getJList().getSelectedIndex());
					String tex = "Inserisci il numero di ";
					if (ricetta.getInfo().getUnitaPorzioni() == UnitaPorzioni.altro) {
						if (ricetta.getInfo().getCustom() != null && !ricetta.getInfo().getCustom().isEmpty())
							tex += ricetta.getInfo().getCustom();
						else tex += "porzioni";
					} else tex += ricetta.getInfo().getUnitaPorzioni().toStringPlurale();
					String sValRic = JOptionPane.showInputDialog(this, tex + " per il piatto selezionato", "Inserisci valori", JOptionPane.QUESTION_MESSAGE);
					try {
						if (sValRic != null) {
							int val = Integer.parseInt(sValRic);
							if (val <= 0)
								JOptionPane.showMessageDialog(this, "Attenzione: valore errato", "Errore", JOptionPane.ERROR_MESSAGE);
							else {
								PortataPiatto pp = new PortataPiatto(val, ricetta);
								portataInserita(pp, portata != null?true:false);
							}
						}
					} catch (NumberFormatException nfe) {
						JOptionPane.showMessageDialog(this, "Attenzione: valore errato", "Errore", JOptionPane.ERROR_MESSAGE);
					}
					break;
				case CIBI:
					cibo = cibi.get(getJList().getSelectedIndex());
					if (cibo.getInfo().getUnitaRiferimento() == null) {
						PortataCibo pc = new PortataCibo(0, cibo);
						portataInserita(pc, portata != null?true:false);
					} else {
						String text = cibo.getInfo().getUnitaRiferimento() != null ? "Inserisci il numero dei " + cibo.getInfo().getUnitaRiferimento().toString(true) : "Inserisci la quantita";
						String sValCibo = JOptionPane.showInputDialog(this, text + " per il cibo selezionato ", "Inserisci valore", JOptionPane.QUESTION_MESSAGE);
						try {
							if (sValCibo != null) {
								int val = Integer.parseInt(sValCibo);
								if (val <= 0)
									JOptionPane.showMessageDialog(this, "Attenzione: valore errato", "Errore", JOptionPane.ERROR_MESSAGE);
								else {
									PortataCibo pc = new PortataCibo(val, cibo);
									portataInserita(pc, portata != null?true:false);
								}
							}
						} catch (NumberFormatException nfe) {
							JOptionPane.showMessageDialog(this, "Attenzione: valore errato", "Errore", JOptionPane.ERROR_MESSAGE);
						}
					}
					break;
				case BEVANDE:
					bevanda = bevande.get(jList.getSelectedIndex());
					if (bevanda.getInfo().getUnitaRiferimento() == null) {
						PortataCibo pc = new PortataCibo(0, bevanda);
						portataInserita(pc, portata != null?true:false);
					} else {
						String txt = bevanda.getInfo().getUnitaRiferimento() != null ? "Inserisci i " + bevanda.getInfo().getUnitaRiferimento().toString(true) : "Inserisci la quantita";
						String sValBevanda = JOptionPane.showInputDialog(this, txt + " per il cibo selezionato", "Inserisci valore", JOptionPane.QUESTION_MESSAGE);
						try {
							if (sValBevanda != null) {
								int val = Integer.parseInt(sValBevanda);
								if (val <= 0)
									JOptionPane.showMessageDialog(this, "Attenzione: valore errato", "Errore", JOptionPane.ERROR_MESSAGE);
								else {
									PortataBevanda pb = new PortataBevanda(val, bevanda);
									portataInserita(pb, portata != null?true:false);
								}
							}
						} catch (NumberFormatException nfe) {
							JOptionPane.showMessageDialog(this, "Attenzione: valore errato", "Errore", JOptionPane.ERROR_MESSAGE);
						}
					}
					break;
			}
		}
		if (e.getSource() == getBAnnulla()) {
			dispose();
		}
	}
	
	public void portataInserita(Portata portata, boolean modifica) {
		lista.portataInserita(portata, pos, modifica);
		dispose();
	}
	
}
